pyenv-virtualenvでAnsible2系とAnsible1系を使い分ける
渡辺です。
先日、待望のAnsible2.0がリリースされました。 様々な機能拡張がされていますが、個人的に待望な機能はブロック構文です。 with_itemsなどでバラバラにループしなければならなかった記述がブロックですっきりと整理できるのはRoleのメンテナンスの点でとても助かります。
ですが、Ansible2.0は後方互換性は高いものの、細かい点で挙動が異なるようです。 そのままAnsible1.0の資産を利用できるともいかないのが現実でした。 このため、しばらくはAnsibleの実行環境ではAnsible2.0系とAnsible1.0系の両方を実行可能にしておく必要があります。
というわけで、Mac環境でAnsible1.0を残したまま、Ansible2.0を利用できるようにする手順をまとめます。 Mac以外の環境の場合は、pyenv-virtualenvのインストールまでを環境毎に調べて実行してください。
brewインストールのAnsibleをアンインストールする
Mac環境では、brewでAnsibleをインストールしている人が多いと思います。 このままだと使い分けに支障がでるため、brew管理のAnsibleは潔く削除しましょう。
$ brew uninstall ansible --force
pyenv-virtualenv のインストール
続けて、複数のバージョンのPythonをインストールして切り替える事のできるpyenv、さらにpyenvのプラグインとして同じバージョンのPython環境も複製して切り替える事の出来るpyenv-virtualenvをインストールします。
$ brew install pyenv-virtualenv
pyenvはpyenv-virtualenvをインストールすれば依存しているので、一緒にインストールされるので安心してください。
pyenv-virtualenvを利用し、Ansible2系の環境とAnsible1系のPython環境を作成し、それぞれの環境にAnsibleをインストールしていきます。
ansible2系のインストール
AnsibleはPython2.6または2.7でなければ動作しないので、ここではPython2.7.10を利用します。
はじめにpyenvでPython2.7.10をインストールします。
$ pyenv install 2.7.10 $ pyenv versions * system (set by /Users/shuji/.pyenv/version) 2.7.10
続けて、Python2.7.10のvirtualenvとしてansible2を作成し、globalで利用するバージョンに設定します。
$ pyenv virtualenv 2.7.10 ansible2 $ pyenv versions * system (set by /Users/shuji/.pyenv/version) 2.7.10 ansible2 $ pyenv global ansible2 $ pyenv versions system 2.7.10 * ansible2 (set by /Users/shuji/.pyenv/version) $ python --version Python 2.7.10
これで現在のglobal pythonは、pyenv-virtualenv環境のansible2(Python2.7.10)になりました。 後は、この環境のpipを使ってAnsibleをインストールします。
$ pip install ansible
最新版(ブログ執筆時点では2.0.0.2)がインストールされます。 以上でAnsible2系が動作する環境が作成できました(パスが通っていないので、シェルを再起動してください)。
$ ansible --version ansible 2.0.0.2 config file = configured module search path = Default w/o overrides $ python --version Python 2.7.10
ansible1系のインストール
Ansible2系の環境は残しつつ、Ansible1系もインストールしましょう。
ansible2と同様に、Python2.7.10のvirtualenvとしてansible1を作成し、globalで利用するバージョンに設定します。
$ pyenv virtualenv 2.7.10 ansible1 $ pyenv versions system (set by /Users/shuji/.pyenv/version) 2.7.10 ansible1 * ansible2 $ pyenv global ansible1 $ pyenv versions system 2.7.10 * ansible1 (set by /Users/shuji/.pyenv/version) ansible2
これで現在のglobal pythonは、pyenv-virtualenv環境のansible1(Python2.7.10)になりました。 後は、この環境のpipを使ってAnsibleをインストールします。
$ pip install ansible==1.9.4
バージョン情報を付与しないと最新版がインストールされてしまうので注意してください。 Ansible1系が動作していることが確認できます(パスが通っていないので、シェルを再起動してください)。
$ ansible --version ansible 1.9.4 configured module search path = None $ python --version Python 2.7.10
Ansible1とAnsible2の切り替え
Ansible1系とAnsible2系の切替は、pyenvを利用します。
$ pyenv versions system 2.7.10 ansible1 * ansible2 (set by /Users/shuji/.pyenv/version) $ ansible --version ansible 2.0.0.2 config file = configured module search path = Default w/o overrides $ pyenv global ansible1 $ pyenv versions system 2.7.10 * ansible1 (set by /Users/shuji/.pyenv/version) ansible2 $ ansible --version ansible 1.9.4 configured module search path = None
まとめ
安直にAnsible2にバージョンアップすると痛い目にあう可能性があるので、pyenv-virtualenvでAnsible1系で実行できる環境を準備をしておきましょう。